package main

import "fmt"

/**
 * 函数参数传递的是值
 */
func changeValue(a int) {
	fmt.Printf("a: %d \n", a)
	a = 200
	fmt.Printf("change a: %d \n", a)
}

/**
 * 函数参数传递的是指针
 */
func changePointer(a *int) {
	fmt.Printf("a: %d \n", *a)
	*a = 200
	fmt.Printf("change a: %d \n", *a)
}

// 指定数组长度 值拷贝
func arrList(arr [5]int) {
	fmt.Printf("arr: %v \n", arr)
}

/**
 * 函数参数传递的是切片  引用传递
 */
func sliceArrList(arr []int) {
	fmt.Printf("arr: %v \n", arr)
}

/**
 * 函数参数传递的是map  引用传递
 */
func changeMap(myMap map[string]string) {
	for k, v := range myMap {
		fmt.Printf("k: %s, v: %s \n", k, v)
	}
	fmt.Println("修改name为李四")
	myMap["name"] = "李四"
}

func copyMap(src map[string]string) map[string]string {
	dst := make(map[string]string)
	for k, v := range src {
		dst[k] = v
	}
	return dst
}

type Person struct {
	name string
	age  int
}

/**
 * 函数参数传递的是结构体  值传递 和JAVA不一样
 */
func changeStruct(person Person) {
	person.name = "王五"
}

/**
 * 函数参数传递的是结构体  指针传递
 */
func changeStructPointer(person *Person) {
	person.name = "王五"
}

func main() {
	var x = 100
	changeValue(x)
	changePointer(&x)
	fmt.Printf("x: %d", x)

	var arr = [4]int{1, 2, 3, 4}
	//arrList(arr)
	fmt.Println(arr)

	var slice = []int{1, 2, 3, 4}
	sliceArrList(slice)

	var myMap = map[string]string{
		"name": "张三",
		"age":  "18",
		"sex":  "男",
		"city": "上海",
	}

	myMap2 := make(map[string]string)
	//拷贝map
	myMap2 = copyMap(myMap)
	changeMap(myMap)
	fmt.Printf("myMap:%v \n", myMap)
	fmt.Printf("myMap2:%v \n", myMap2)

	p := Person{name: "张三", age: 18}
	changeStruct(p)
	fmt.Printf("Person:%v \n", p)
	changeStructPointer(&p)
	fmt.Printf("Person:%v \n", p)
}
